﻿/*
 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation; either version 2 of the License, or
 (at your option) any later version.

 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.

 You should have received a copy of the GNU General Public License
 along with this program; if not, write to the Free Software
 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*/
using System;
using System.Collections.Generic;
using System.Linq;
using LeftronicApi.Interfaces;
using LeftronicApi.Models;
using LeftronicApi.Models.Wire.Single;
using ServiceStack.Text;

namespace LeftronicApi
{
    public class SimplePoster : IDashboardPoster
    {
        public IHttpPoster HttpPoster { get; set; }

        public void Init()
        {
            HttpPoster = new HttpPoster();
        }

        public IList<PostError> Post(string accessKey, IList<BaseModel> points, bool throwOnError)
        {
            return points.Select(point => Post(accessKey, point, throwOnError)).Where(error => error != null).ToList();
        }

        public PostError Post(string accessKey, BaseModel point, bool throwOnError)
        {
            JsConfig.ExcludeTypeInfo = true;
            var buildedPoint = Builder.Build(accessKey, point);
            var msg = JsonSerializer.SerializeToString(buildedPoint, buildedPoint.GetType());

            try
            {
                var result = HttpPoster.Post(msg, Properties.Settings.Default.LeftronicPostUrl);
                if (result != "Success!")
                {
                    if (throwOnError)
                    {
                        throw new InvalidOperationException(
                            string.Format("Error return when posting to dashboard, message [{0}], json [{1}]",
                                result, msg));
                    }

                    return new PostError {Error = result, Record = point};
                }

                return null;
            }
            catch (Exception ex)
            {
                if (throwOnError)
                {
                    throw;
                }

                return new PostError {Error = ex.ToString(), Record = point};
            }
        }
    }
}
